远程控制
设备远程控so esay,只需两招。
第一招,修改xml文件。在xml中的apis部分根据业务逻辑自定义控制参数。然后,swaylink就会根据定义的API生成相应的控制界面。我的小车的xml文件示例:
<dev>
<dev_id>mutao1</dev_id>
<name>我的小车</name>
<model>Model-I</model>
<maker>Mutao</maker>
<timezone>8</timezone>
<longitude>104.04</longitude>
<latitude>39.90</latitude>
<height>30</height>
<keep_online>0</keep_online>
<apis>
<api>
<id>1</id>
<name>点火</name>
<remark>start</remark>
</api>
<api>
<id>2</id>
<name>出发</name>
<remark>在希望的田野上</remark>
<arg>
<name>move</name>
<remark>前进</remark>
<unit>m</unit>
</arg>
<arg>
<name>back</name>
<remark>后退</remark>
<unit>m</unit>
</arg>
</api>
</apis>
</dev>
对应的swaylink控制界面请看图:
是不是很科学。在apis中有几个api控制界面就有几个控制参数,如果需要具体输入值就可以在api中写入arg就可以了,有几个输入值就有几个args。
Notice:修改了xml文件需要重新上传才能生效哦!
第二招,设备联网远程控制。首先设备要接入互联网中,然后在连入swaylink平台就可以进行控制了。 使用slink phpsdk 只需下面几行代码就能搞定。
require './SLink/SLinkClient.class.php';
$SLinkClient = new \Slink\SLinkClient('mutao1');
$SLinkClient->ctrl();
这样就可以了,然后在swaylink 上面控制界面就可以进行控制了。设备就会收到如下的控制指令。
然后设备就可以根据控制指令完成响应的动作。
其他语言接入主要是以下几个流程。1,请求接口获取端口和ip。2,向获取的端口和ip发送身份验证 3.监听端口 下面是php接入的代码
1.请求获取端口ip
请求地址 http://www.mydehui.com/swaylink.php?m=Queen&c=upload&a=willListen POST方法
请求参数:v=2.0&dev_id=xxxx&token=xxxx&load=XXXXXXXXX
接口回复:[192.168.31.109:56280]
':'前是服务器ip,服务器端口
2.身份验证
创建UDP客户端套接字向获取到的ip和端口发送数据进行身份验证。
身份验证发送数据:
{"v":"2.0","dev_id":"mutao1","token":"xxxx"}
身份验证成功收到OK两个字符。
3.监听端口
获取本地UDP客户端的ip和端口,由有客户端转为服务端,然后一直监听,slink发来的控制指令就能收到了。
以上步骤每隔三十秒重复一次,这样设备就可以一直和服务器保持连接。下面是php示例代码。
set_time_limit(0);
while(1){
//获取ip和端口
$url = SLinkClient::SERVERURL.'?m=Queen&c=upload&a=willListen';
$this->setReqFormat($this->req['dev_id']);
$result = $this->sendRequest($url, $this->req);
if(empty($result)) break;
preg_match('/\[.*\]$/', $result, $result);
$result = explode(':', trim($result[0], '[]"'));
$ip = $result[0];
$port = $result[1];
//创建客户端连接服务器
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_option( $socket, SOL_SOCKET, SO_REUSEADDR, 1 );
socket_set_option( $socket, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>10, "usec"=>0 ) );
socket_set_option( $socket, SOL_SOCKET, SO_SNDTIMEO, array("sec"=>3, "usec"=>0 ) );
$flag = socket_connect($socket, $ip, $port);
//获取本地客户端ip和端口
socket_getsockname($socket,$locIp,$locPort);
echo "[$locIp:$locPort]\r\n";
if(!$flag) {
echo 'Cannot connect to service';
exit();
}
//发送身份验证请求{"v":"2.0","dev_id":"mutao1","token":"xxxx"}
$buf = json_encode($this->req);
socket_write($socket, $buf, strlen($buf));
$data = socket_read($socket,1024);
if($data != 'OK') continue;
socket_close($socket);
//关闭客户端套接字开启服务端套接字开始监听$locIp $locPort
$socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
if (!$socket) {
die("socket create failed . reason:" . socket_strerror(socket_last_error()));
}
socket_set_option( $socket, SOL_SOCKET, SO_REUSEADDR, 1 );
socket_set_option( $socket, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>30, "usec"=>0 ) );
socket_set_option( $socket, SOL_SOCKET, SO_SNDTIMEO, array("sec"=>3, "usec"=>0 ) );
$flag = socket_bind( $socket, $locIp, $locPort);
if ( $flag === false ) {
echo "socket bind failed . reason:" . socket_strerror( socket_last_error( $socket ) );
}
$t = time();
do{
$inMsg = false;
@socket_recvfrom( $socket, $inMsg, 1024, 0, $from, $port );
if($inMsg) {
echo $inMsg."\r\n";
socket_sendto($socket, 'OK', 2, 0, $from, $port);
}
else{
echo 'no message'."\r\n";
//三十秒内无控制信息则重新请求
if(time()-30>$t) break;
}
}while (true);
socket_close($socket);
}